package com.hb.config;

import com.hb.service.SpitterService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean;
import org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter;

import java.net.MalformedURLException;
import java.net.URL;

@Configuration
public class JAXWSConfig {
    /**
     * SimpleJaxWsServiceExporter 不需要再做其他的事情就可以完成所有的工作。当启动的时候，它会搜索 Spring 应用上下文来查找所有使用 @WebService 注解的 bean。
     * 当找到符合的 bean 时，SimpleJaxWsServiceExporter 使用 http://localhost:8080/ 地址将 bean 发布为 JAX-WS 端点。SpitterServiceEndpoint 就是其中
     * 一个被查找到的 bean。
     * @return
     */
    @Bean
    public SimpleJaxWsServiceExporter jaxWsExporter() {
        SimpleJaxWsServiceExporter exporter = new SimpleJaxWsServiceExporter();
        // 因为 SimpleJaxWsServiceEndpoint 的默认基本地址为 http://localhost:8080/，而 SpitterServiceEndpoint 使用了 @Webservice(servicename="SpitterService") 注解，
        // 所以这两个 bean 所形成的 Web 服务地址均为 http://localhost:8080/SpitterService。但是我们可以完全控制服务 URL，如果希望调整服务 URL 的话，我们可以调整基本地址。
        // 例如，如下 SimpleJaxWsServiceEndpoint 的配置把相同的服务端点发布到 http://localhost:8888/srvices/SpitterService。
        exporter.setBaseAddress("http://localhost:8888/services/");
        return exporter;
    }

    @Bean
    public JaxWsPortProxyFactoryBean spitterService() throws MalformedURLException {
        try{
            JaxWsPortProxyFactoryBean proxy = new JaxWsPortProxyFactoryBean();
            // 为 JaxWsPortProxyFactoryBean 设置几个属性就可以工作了。wsdlDocumentUrl 属性标识了远程 Web 服务定义文件的位置。JaxWsPortProxyFactory bean
            // 将使用这个位置上可用的 WSDL 来为服务创建代理
            proxy.setWsdlDocumentUrl(new URL("http://localhost:8080/services/SpitterService?wsdl"));
            // 在服务的 WSDL 中定义多个服务和端口是允许的。鉴于此，JaxWsPortProxyFactoryBean 需要我们使用 portName和serviceName 属性指定端口和服务名称。
            // WSDL 中 <wsdl:port> 和 <wsdl:service> 元素的 name 属性可以帮助我们识别出这些属性该设置成什么。
            proxy.setServiceName("spitterService");
            proxy.setPortName("spitterServiceHttpPort");
            // 由 JaxWsPortProxyFactoryBean 所生成的代理实现了 serviceInterface 属性所指定的 SpitterService 接口
            proxy.setServiceInterface(SpitterService.class);
            // namespaceUri 属性指定了服务的命名空间。命名空间将有助于 JaxWsPortProxyFactoryBean 去定位 WSDL 中的服务定义。正如端口和服务名一样，
            // 我们可以在 WSDL 中找到该属性的正确值。它通常会在 <wsdl:definitions> 的 targetNamespace 属性中。
            proxy.setNamespaceUri("http://spitter.com");
            return proxy;
        } catch (MalformedURLException e) {
            return null;
        }
    }
}
